package com.cz.sync;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.PageUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class WmsSync {
    public static void main(String[] args) {
        String fromGroup = "mes-prod-slave";
        String toGroup = "uat3";
        int pageSize = 1000; // 每次查询的页大小
        int batchSize = 100; // 每个线程处理 100 条数据

        // 获取总数据量
        try {
            int totalCount = Db.use(fromGroup).queryNumber("SELECT COUNT(*) FROM wms4db.wms_batch_inventory").intValue();
            System.out.println("totalCount: " + totalCount);

            // 计算总页数
            int totalPage = PageUtil.totalPage(totalCount, pageSize);
            System.out.println("totalPage: " + totalPage);

            // 创建一个线程池来执行分页查询，最大并发数设置为 10
            ExecutorService executorService = Executors.newFixedThreadPool(10); // 线程池大小设置为10

            // 提交分页任务到线程池
            List<Future<Void>> futures = new ArrayList<>();
            for (int i = 0; i < totalPage; i++) {
                final int pageNumber = i;

                try {
                    // 计算分页查询的起始索引
                    int startIndex = PageUtil.getStart(pageNumber, pageSize);

                    // 使用 LIMIT 和 OFFSET 来分页查询数据
                    String sql = "SELECT * FROM wms4db.wms_batch_inventory LIMIT " + startIndex + ", " + pageSize;
                    List<Entity> entityList = Db.use(fromGroup).query(sql);

                    // 使用线程池对每批数据进行并发处理
                    if (CollUtil.isNotEmpty(entityList)) {
                        // 将每100条数据分成一批，并为每一批创建一个线程
                        List<Future<Void>> batchFutures = new ArrayList<>();
                        int totalEntities = entityList.size();
                        for (int j = 0; j < totalEntities; j += batchSize) {
                            int endIndex = Math.min(j + batchSize, totalEntities);
                            List<Entity> batch = entityList.subList(j, endIndex);

                            // 为每一批数据创建一个任务
                            batchFutures.add(executorService.submit(() -> {
                                batch.forEach(entity -> {
                                    try {
                                        // 设置表名，执行插入或更新
                                        entity.setTableName("wms4db.wms_batch_inventory");
                                        Db.use(toGroup).insertOrUpdate(entity, "id");
                                    } catch (SQLException e) {
                                        e.printStackTrace();
                                    }
                                });
                                return null;
                            }));
                        }

                        // 等待每个批次的处理完成
                        for (Future<Void> batchFuture : batchFutures) {
                            try {
                                batchFuture.get(); // 等待每个任务完成
                            } catch (InterruptedException | ExecutionException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                System.out.println("第"+i+"页 执行完成");
            }


            // 关闭线程池
            executorService.shutdown();
            System.out.println("数据同步完成！");

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
